package persistencia;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import negocio.CEP;
import negocio.Veiculo;

public class MyCarroDAO extends ConexaoMySQLDAO{
    
    private PreparedStatement stIncluir;
    private PreparedStatement stPesquisaCodigo;
    private PreparedStatement stPesquisaModelo;
    private PreparedStatement stListar;
    private PreparedStatement stAtualiza;
    private final Connection con;
    
    public MyCarroDAO() throws IOException, SQLException {
        con = super.getConexao();
        stIncluir = con.prepareStatement(
                "INSERT INTO carros (id_carro, placa, marca,"
                + " modelo, chassi, combustivel, observacoes) VALUES (?, ?, ?, ?, ?, ?, ?)");
        stListar = con.prepareStatement(
                "SELECT * FROM carros");
        stPesquisaCodigo = con.prepareStatement(
                "SELECT * FROM carros WHERE id_carro=?");
        stPesquisaModelo = con.prepareStatement(
                "SELECT * FROM carros WHERE modelo LIKE ?");
        stAtualiza = con.prepareStatement(
                "UPDATE pessoas SET placa=?, marca=?,"
                + " modelo=?, chassi=?, combustivel=?, observacoes=?  WHERE id_carro=?");
    }

    public void adiciona(Veiculo umCarro) throws Exception{
        stIncluir.setInt(1, umCarro.getId_carro());
        stIncluir.setString(2, umCarro.getPlaca());
        stIncluir.setString(3, umCarro.getMarca());
        stIncluir.setString(4, umCarro.getModelo());
        stIncluir.setString(5, umCarro.getChassi());
        stIncluir.setInt(6, umCarro.getTipocombustivel());
        stIncluir.setString(7, umCarro.getObs());
        stIncluir.executeQuery();
    }

    public List<Veiculo> getCarros() throws Exception{
        return getLista(stListar.executeQuery());
    }

    public void altera(Veiculo novoCarro) throws Exception {
        stAtualiza.setString(1, novoCarro.getPlaca());
        stAtualiza.setString(2, novoCarro.getMarca());
        stAtualiza.setString(3, novoCarro.getModelo());
        stAtualiza.setString(4, novoCarro.getChassi());
        stAtualiza.setInt(5, novoCarro.getTipocombustivel());
        stAtualiza.setString(6, novoCarro.getObs());
        stAtualiza.setInt(7, novoCarro.getId_carro());
        stAtualiza.executeUpdate();
    }

    public List<Veiculo> procuraPorNome(String chave) throws Exception {
        stPesquisaModelo.setString(1, chave+"%");
        return getLista(stPesquisaModelo.executeQuery());
    }

    public Veiculo procuraPorCodigo(int codigo) throws Exception {
        stPesquisaCodigo.setInt(1, codigo);
        List<Veiculo> res = getLista(stPesquisaCodigo.executeQuery());
        if(res.isEmpty()) 
            throw new Exception("Registro não encontrado");
        return res.get(0);
    }

    private List<Veiculo> getLista(ResultSet rs) throws Exception {
        List<Veiculo> tmp = new ArrayList<Veiculo>();
        while (rs.next()) {
            tmp.add(this.motaObjeto(rs));
        }
        return tmp;
    }

    private Veiculo motaObjeto(ResultSet rs) throws SQLException {
            Veiculo umCarro = new Veiculo();
            umCarro.setId_carro(rs.getInt("id_carro"));
            umCarro.setPlaca(rs.getString("placa"));
            umCarro.setMarca(rs.getString("marca"));
            umCarro.setModelo(rs.getString("modelo"));
            umCarro.setChassi(rs.getString("chassi"));
            umCarro.setTipocombustivel(rs.getInt("combustivel"));
            umCarro.setObs(rs.getString("observacao"));
            
        return umCarro;
    }
}